package org.brisling.websocket.service;

import java.util.HashMap;
import java.util.Map;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import org.brisling.common.util.JsonUtil;
import org.brisling.common.util.MapUtil;
import org.brisling.websocket.command.CommandInvoke;
import org.brisling.websocket.domain.WSView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 
 * <p>Title: WebsocketService</p>
 * <p>Description: websocket服务端定义</p>
 * <p>Company: tongking</p>
 * @author jackson wang
 * @since 1.0
 * @version 1.0
 * @date 2017年6月12日 下午10:47:48
 */
@Service
@ServerEndpoint("/websocket/dqpf/{userId}")
public class WebsocketService {
	
	@Autowired
	private CommandInvoke commandInvoke;
	
	private static Map<String, Session> sessionMap=new HashMap<String, Session>();//在线的客户端session集合，只在第一次new的时候初始化。
	  
	
	/**
	   * 接收信息事件
	   * @param message 客户端发来的消息
	   * @param session 当前会话
	   */
	  @SuppressWarnings("unchecked")
	@OnMessage
	  public void onMessage(String message,Session session,@PathParam(value="userId")String userId)throws Exception {
		  
		  Map<String,Object> param = null;
		  
		  
		  WSView<Object> v = null;
		  //获取消息参数
		  if(message!=null){
			  param = JsonUtil.body2Class(message, Map.class);
		  }
		  
		  
		  
		  String module = null;
		  
		  System.out.println("消息接收成功！");
		  
  		//执行获取数据
  		module = MapUtil.getMapData(param, "module");
  		if(module!=null){  			
  			v=commandInvoke.invoke(module, param);
  		}    
	    
	    this.broadcast(userId, v);
	  }
	  
	  /**
	   * 打开连接事件
	   * @throws Exception 
	   */
	  @OnOpen
	  public void onOpen(Session session,@PathParam(value="userId")String userId) throws Exception {
	    
		  
		  WSView<Object> v = null;
		  
		  
		  
		  if(userId!=null){
			  
			  
				  	System.out.println("打开连接成功！");
				    sessionMap.put(userId, session);
				    System.out.println("用户"+userId+"进来了。。。");
				    System.out.println("当前在线人数："+sessionMap.size());
				    
				    //查询未读消息
				    Integer cnt = getNotification(userId);
				    
				    if(cnt >0){
				    	v = new WSView<Object>();
					    v.setBadge(5);
					    
					    v.setBizcode("notification");
				    }
			 
		  }
		  
		  //判断是否有通知信息
		  if(v!=null){
			  this.broadcast(userId, v);
		  }
	    
	  }
	  
	  private Integer getNotification(String userid){
		  return 0;
	  }
	 
	  /**
	   * 关闭连接事件
	   */
	  @OnClose
	  public void onClose(Session session,@PathParam(value="userId")String userId) {
	    System.out.println("关闭连接成功！");
	    System.out.println("用户"+userId+"离开了。。。");
	    sessionMap.remove(userId);
	    System.out.println("当前在线人数："+sessionMap.size());
	  }
	  
	  /**
	   * 错误信息响应事件
	   * @param session
	   * @param throwable
	   */
	  @OnError
	  public void OnError(Session session,Throwable throwable,@PathParam(value="userId")String userId) {
		    System.out.println("异常："+throwable.getMessage());
		    System.out.println("用户"+userId+"的连接出现了错误。。。");
		    System.out.println("当前在线人数："+sessionMap.size());
	  }
	  
		 /** 
		 * 将数据传回客户端 
		 * 异步的方式 
		 * @param userid	用户id 
		 * @param message 	消息
		 * @return boolean	是否发送成功
		 */  
		public boolean broadcast(String userid, WSView<Object> msg) {
			boolean ret = false;
			
			if(msg!=null){
				String message = JsonUtil.objToJson(msg);
			
			    if (sessionMap.containsKey(userid)) {  
			    	sessionMap.get(userid).getAsyncRemote().sendText(message); 
			    	
			    	System.out.println("消息发送成功！");
			    	ret = true;
			    } else {  
			        //throw new NullPointerException("[" + myWebsocket +"]Connection does not exist");
			    	ret = false;
			    }
		    
			}
		    return ret;
		}  
}
